package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.primefaces.event.RowEditEvent;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKLetraPorCobrar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_LETRA_DE_CAMBIO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.LetraPorCobrarModel;
import pe.com.cotelasa.scp.dominio.service.IServicioBanco;
import pe.com.cotelasa.scp.dominio.service.IServicioCliente;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioLetraDeCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.Banco;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleLetra;
import pe.com.cotelasa.scp.entidad.Letra;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

@Named(value = "MBLetraPorCobrar")
@Scope("request")
public class MBLetraPorCobrar extends MBGenerico implements IMantenedor, IObserver, Serializable {
 
	private static final long serialVersionUID = 1584931178906054428L;
	private static Logger logger = Logger.getLogger(MBLetraPorCobrar.class);
	
	@Inject
	private BKLetraPorCobrar bkLetraPorCobrar;
	
	@Inject
	private IServicioLetraDeCambio servicioLetraDeCambio;
	
	@Inject
	private IServicioTipoMoneda servicioTipoMoneda;
	
	@Inject
	private IServicioCliente servicioCliente;
	
	@Inject
	private IServicioProveedor servicioProveedor;
	
	@Inject
	private IServicioVentaFacturacion servicioVentaFacturacion;
	
	@Inject
	private IServicioCompraFacturacion servicioFactura;
	
	@Inject
	private IServicioBanco servicioBanco;
	
	@Inject
	private BKSession bkSession;

	public String mostrarMantenimiento() {
		try {
			cargarCombo();
			bkLetraPorCobrar.setMostrarListaClientes(servicioCliente.listarClientesActivos());
			bkLetraPorCobrar.setMostrarListaTiposMoneda(servicioTipoMoneda.listarTipoMonedasActivos());
		} catch (ServiceException e) {
			mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
		}
		return URLPaginacion.LetraPorCobrar.URL_FORMULARIO_LETRA_POR_COBRAR;
	}

	public void buscarListaLetrasPorCobrar() {
		try {
			Letra letra = new Letra();
			letra.getIdCliente().setId(bkLetraPorCobrar.getClienteBusqueda().getId());
			letra.setEstadoLetra(bkLetraPorCobrar.getEstadoSeleccionado().getId());
			letra.getTipoMoneda().setId(bkLetraPorCobrar.getTipoMonedaBusqueda().getId());
			letra.setTipoLetra(Constantes.TipoLetra.LETRA_POR_COBRAR);
			bkLetraPorCobrar.setListaLetrasPorCobrar(servicioLetraDeCambio.listarLetrasPorFiltro(letra));
		} catch (Exception e) {
			mostrarError("Ocurrieron algunos problemas al buscar la informacion." + e.getMessage());
			logger.error(e.getMessage(), e);
		}
	}

	private boolean validarFacturasPorCobrar(){
		if(this.bkLetraPorCobrar.getClienteSeleccionado().getId() == 0){
			mostrarWarning("Seleccione un Cliente");
			return false;
		}else if(this.bkLetraPorCobrar.getTipoMonedaSeleccionado().getId() == 0){
			mostrarWarning("Seleccione el tipo de moneda");
			return false;
		}
		return true;
	}
	
	public void buscarListaFacturasPorCobrar(){
		try {
			if(validarFacturasPorCobrar()){
				VentaFacturacion ventaFacturacion = new VentaFacturacion();
				ventaFacturacion.getCodCliente().setId(this.bkLetraPorCobrar.getClienteSeleccionado().getId());
				ventaFacturacion.getMoneda().setId(this.bkLetraPorCobrar.getTipoMonedaSeleccionado().getId());
				bkLetraPorCobrar.setListaFacturasPorCobrar(servicioVentaFacturacion.obtenerFacturasVentaParaLetras(ventaFacturacion));
				bkLetraPorCobrar.setLetraPorCobrarModel(new LetraPorCobrarModel(new ArrayList<VentaFacturacion>(bkLetraPorCobrar.getListaFacturasPorCobrar())));
			}
		} catch (Exception e) {
			e.printStackTrace();
			mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
		}
	} 
	
	public void selectFactura(){
		VentaFacturacion[] ventaFacturacion = this.bkLetraPorCobrar.getFacturasSeleccionadas();
		this.bkLetraPorCobrar.setMontoTotal(new BigDecimal(0));
		for (VentaFacturacion ventaFacturacion2 : ventaFacturacion) {
			this.bkLetraPorCobrar.setMontoTotal(this.bkLetraPorCobrar.getMontoTotal().add(new BigDecimal(ventaFacturacion2.getPorCobrar())));
		}
	}
	
	public void unSelectFactura(){
		VentaFacturacion[] ventaFacturacion = this.bkLetraPorCobrar.getFacturasSeleccionadas();
		for (VentaFacturacion ventaFacturacion2 : ventaFacturacion) {
			this.bkLetraPorCobrar.setMontoTotal(this.bkLetraPorCobrar.getMontoTotal().subtract(new BigDecimal(ventaFacturacion2.getPorCobrar())));
		}
	}
	
	@Override
	public void actualizarObservador(Object object) {
		// TODO Auto-generated method stub
	}

	@Override
	public String actualizar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String guardar() {
		try {
			if(validarRegistro()){
				Letra letra = new Letra();
				letra.setEstadoLetra(this.bkLetraPorCobrar.getEstadoSeleccionado().getId());
				letra.setEstadoRegistro(EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
				letra.getIdCliente().setId(this.bkLetraPorCobrar.getClienteSeleccionado().getId());
				letra.setNumeroLetra(this.bkLetraPorCobrar.getNumeroLetra().toString());
				letra.getTipoMoneda().setId(this.bkLetraPorCobrar.getTipoMonedaSeleccionado().getId());
				letra.setTipoLetra(Constantes.TipoLetra.LETRA_POR_COBRAR);
				letra.setTotal(this.bkLetraPorCobrar.getMontoTotal());
				letra.setFecCreacion(new Date());
				letra.setFecEmision(new Date());
				letra.setUsrCreacion(bkSession.getUsuario().getUsuario());
				letra.setFormaDePago("C");
				letra.setFecVencimiento(this.bkLetraPorCobrar.getRegistrarFechaVencimiento());
				List<VentaFacturacion> listaDetalle = Arrays.asList(this.bkLetraPorCobrar.getFacturasSeleccionadas());
				List<DetalleLetra> listaDetalleLetra = new ArrayList<DetalleLetra>();
				for (VentaFacturacion ventaFacturacion : listaDetalle) {
					DetalleLetra detalleLetra = new DetalleLetra();
					detalleLetra.setIdLetra(letra);
					detalleLetra.setIdVentaFacturacion(ventaFacturacion);
					detalleLetra.setEstadoRegistro(EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
					detalleLetra.setFecCreacion(new Date());
					detalleLetra.setUsrCreacion(bkSession.getUsuario().getUsuario());
					listaDetalleLetra.add(detalleLetra);
				}
				letra.setDetalleLetraCollection(listaDetalleLetra);
				servicioLetraDeCambio.guardarLetraDeCambio(letra);
				mostrarMensaje("Se registro los datos satisfactoriamente");
				this.bkLetraPorCobrar.getClienteBusqueda().setId(0);
				this.bkLetraPorCobrar.getTipoMonedaBusqueda().setId(0);
				this.bkLetraPorCobrar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.TODOS);
			}else{
				return "";
			}
		} catch (Exception e) {
			e.printStackTrace();
			mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
			logger.error(e.getMessage(), e);
			return "";
		}
		return URLPaginacion.LetraPorCobrar.URL_FORMULARIO_LETRA_POR_COBRAR;
	}
	
	private boolean validarRegistro(){
		if(this.bkLetraPorCobrar.getBancoSeleccionado()==0){
			mostrarWarning("Seleccionar un banco");
			return false;
		}else if(this.bkLetraPorCobrar.getRegistrarFechaVencimiento() == null){
			mostrarWarning("Seleccionar un fecha de vencimiento");
			return false;
		}else if(this.bkLetraPorCobrar.getTipoMonedaSeleccionado().getId() == 0){
			mostrarWarning("Seleccionar un tipo de moneda");
			return false;
		}else if(this.bkLetraPorCobrar.getClienteSeleccionado().getId() == 0){
			mostrarWarning("Seleccionar un cliente");
			return false;
		}else if(this.bkLetraPorCobrar.getNumeroLetra()== null  || this.bkLetraPorCobrar.getListaFacturasPorCobrar().size()<=0){
			mostrarWarning("Debe seleccionar alguna factura por pagar");
			return false;
		}else {
			return true;
		}
	}

	@Override
	public void eliminar(ActionEvent actionEvent) {
		// TODO Auto-generated method stub
	}

	@Override
	public String editar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String nuevo() {
		limpiar();
		this.bkLetraPorCobrar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.POR_CANCELAR);
		this.bkLetraPorCobrar.setLetraPorCobrarModel(new LetraPorCobrarModel(new ArrayList<VentaFacturacion>()));
		return URLPaginacion.LetraPorCobrar.URL_FORMULARIO_AGREGAR_LETRA_POR_COBRAR;
	}

	@Override
	public String ver() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String aceptar() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String retroceder() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String cancelar() {
		return URLPaginacion.LetraPorCobrar.URL_FORMULARIO_LETRA_POR_COBRAR;
	}
	
	
	private void cargarCombo() throws ServiceException{
		this.bkLetraPorCobrar.setComboClientesBusqueda(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboClientes(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboEstadoLetrasBusqueda(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboEstadoLetras(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboTipoMonedasBusqueda(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboTipoMonedas(new ArrayList<SelectItem>());
		this.bkLetraPorCobrar.setComboBancos(new ArrayList<SelectItem>());
		
		this.bkLetraPorCobrar.getComboBancos().add(new SelectItem(0,"Seleccione"));
		this.bkLetraPorCobrar.getComboClientesBusqueda().add(new SelectItem(0,"Todos"));
		this.bkLetraPorCobrar.getComboClientes().add(new SelectItem(0,"Seleccione"));
		this.bkLetraPorCobrar.getComboTipoMonedasBusqueda().add(new SelectItem(0,"Todos"));
		this.bkLetraPorCobrar.getComboTipoMonedas().add(new SelectItem(0,"Seleccione"));
		
		Collection<Banco> collecionBanco = servicioBanco.listarBancosActivos();
		this.bkLetraPorCobrar.getComboBancos().add(new SelectItem(0,"Seleccione"));
		for (Banco banco : collecionBanco) {
			this.bkLetraPorCobrar.getComboBancos().add(new SelectItem(banco.getId(),banco.getNombre()));
		}
		
		Collection<Cliente> collectionCliente = servicioCliente.listarClientesActivos();
		for (Cliente cliente : collectionCliente) {
			this.bkLetraPorCobrar.getComboClientesBusqueda().add(new SelectItem(cliente.getId(),cliente.getRazonSocial()));
			this.bkLetraPorCobrar.getComboClientes().add(new SelectItem(cliente.getId(),cliente.getRazonSocial()));
		}
		
		Collection<TipoMoneda> collectionTipoMonedas = servicioTipoMoneda.listarTipoMonedasActivos();
		for (TipoMoneda tipoMoneda : collectionTipoMonedas) {
			this.bkLetraPorCobrar.getComboTipoMonedasBusqueda().add(new SelectItem(tipoMoneda.getId(),tipoMoneda.getNombre()));	
			this.bkLetraPorCobrar.getComboTipoMonedas().add(new SelectItem(tipoMoneda.getId(),tipoMoneda.getNombre()));
		}
		
		for (ESTADO_LETRA_DE_CAMBIO estadoLetraDeCambio : ESTADO_LETRA_DE_CAMBIO.values()) {
			this.bkLetraPorCobrar.getComboEstadoLetrasBusqueda().add(new SelectItem(estadoLetraDeCambio,estadoLetraDeCambio.getNombre()));
			if(estadoLetraDeCambio.getId() != estadoLetraDeCambio.SELECCIONE.getId()){
				this.bkLetraPorCobrar.getComboEstadoLetrasBusqueda().add(new SelectItem(estadoLetraDeCambio,estadoLetraDeCambio.getNombre()));
				this.bkLetraPorCobrar.getComboEstadoLetras().add(new SelectItem(estadoLetraDeCambio,estadoLetraDeCambio.getNombre()));
			}
		}
		
	}
	
	private void limpiar(){
		this.bkLetraPorCobrar.setClienteSeleccionado(new Cliente(0));
		this.bkLetraPorCobrar.setTipoMonedaSeleccionado(new TipoMoneda(0));
		this.bkLetraPorCobrar.setEstadoSeleccionado(ESTADO_LETRA_DE_CAMBIO.SELECCIONE);
	}
	
	
	public void onEdit(RowEditEvent event) {  
	    	try {
	        	Letra letra = (Letra) event.getObject();
	        	letra.setUsrModificacion(bkSession.getUsuario().getUsuario());
	        	letra.setFecModificacion(new Date());
	        	servicioLetraDeCambio.actualizarFechaVencimientoLetra(letra);
			} catch (Exception e) {
				 mostrarError("Error al modificar la fecha de cancelacion de la letra: " + e.getMessage());
				 logger.error(e.getMessage(),e);
			}

	}  
	
	public void cancelacion(Letra letraSeleccionado){
		try{
			letraSeleccionado.setFecCancelacion(new Date());
			letraSeleccionado.setEstadoLetra(ESTADO_LETRA_DE_CAMBIO.CANCELADO.getId());
			servicioLetraDeCambio.cancelarLetraDeCambio(letraSeleccionado);
			mostrarMensaje("Se registro la cancelacion satisfactoriamente.");
		}catch(Exception e){
			 mostrarError("Error al registrar la cancelacion de la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}
	}
	
	public void anular(Letra letraSeleccionado) {
		try{
			letraSeleccionado.setEstadoRegistro(EstadoRegistro.ESTADO_REGISTRO_ELIMINADO);
			servicioLetraDeCambio.anularLetra(letraSeleccionado);
			mostrarMensaje("El registro se anulo satisfactoriamente.");
			buscarListaLetrasPorCobrar();
		}catch(Exception e){
			 mostrarError("Error al anular la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}	
	}
	
	public void detalle() {
		try{
			Letra letraSeleccionado = this.bkLetraPorCobrar.getLetraSeleccionada();
			System.out.println("letraSeleccionado " + letraSeleccionado);
			if(letraSeleccionado !=null ){ 
				letraSeleccionado = servicioLetraDeCambio.obtenerLetradeCambio(letraSeleccionado.getId());
				System.out.println("size:"+letraSeleccionado.getDetalleLetraCollection().size());
				bkLetraPorCobrar.setListaDetalleLetra(new ArrayList<DetalleLetra>(letraSeleccionado.getDetalleLetraCollection()));
			}else{
				bkLetraPorCobrar.setListaDetalleLetra(new ArrayList<DetalleLetra>());
			}	
		}catch(Exception e){
			 mostrarError("Error al cargar el detalle de la letra: " + e.getMessage());
			 logger.error(e.getMessage(),e);
		}		
	}
	
	public void onCancel(RowEditEvent event) {  
	    	  
	}  
}
